#include "Stack.h"
//初始化栈 

//ps为空，不能访问任何成员的

void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps == NULL)
	{
		printf("realloc fail\n");
		exit(-1);
	}
	ps->_capacity = 4;
	ps->_top = 0;

}



//入栈 

void StackPush(Stack* ps, STDataType data)

{

	assert(ps);



	if (ps->_top == ps->_capacity)

	{

		int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;

		//realloc分为原地和异地扩容，小的时候一般是原地，也就是在ps->a的后面，但是ps->a为空捏~

		//估计问题就是这里啦~

		STDataType* tmp = (STDataType)realloc(ps->_a, newcapacity * sizeof(STDataType));

		if (tmp == NULL)

		{

			perror("扩容失败");

			exit(-1);

		}



		ps->_a = tmp;

		ps->_capacity = newcapacity;



	}

	ps->_a[ps->_top] = data;

	ps->_top++;

}



//出栈 

void StackPop(Stack* ps)

{
	assert(ps);
	assert(ps->_top); //判断栈顶下标是否不为0
	ps->_top--;

}



//获取栈顶元素 

STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->_a[ps->_top - 1];

}

//获取栈中有效元素个数 

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

//检测栈是否为空，如果为空返回非零结果，如果不为空返回0 

int StackEmpty(Stack* ps)
{
	return ps->_top == 0;
}



//销毁栈 

void StackDestroy(Stack* ps)

{
	assert(ps);
	assert(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}